// Package main 演示如何使用GORM自动创建数据库表结构
// 通过AutoMigrate方法根据Go结构体自动生成或更新数据库表结构
package main

import (
	"fmt"
	"gin-gorm/global"
	"time"
)

// UserModel 用户模型结构体，定义了用户表的字段和约束
// 注意：此文件中定义的UserModel与models包中的UserModel类似
// 主要区别是这里的结构体为了演示目的而独立定义
// 在实际项目中，应使用统一的模型定义，通常位于models包中
type UserModel struct {
	ID        int64     `gorm:"primaryKey"`              // 主键ID，自动递增
	Name      string    `gorm:"size:16;not null;unique"` // 用户名，最大长度16字符，不能为空且唯一
	Age       int       `gorm:"default:18"`              // 年龄，默认值为18
	CreatedAt time.Time // 创建时间，GORM会自动设置为记录创建时的时间
}

// migrate 执行数据库表结构迁移
// 此函数演示了如何使用GORM的AutoMigrate功能自动创建或更新表结构
// 注意：当前函数有一个潜在问题 - 它尝试迁移UserDetailModel，但在这个文件中没有定义此结构体
// 正确的做法应该是迁移UserModel（本文件中定义的）或从models包导入UserDetailModel
func migrate() {
	// 使用AutoMigrate方法自动创建或更新表结构
	// AutoMigrate会根据传入的结构体自动创建表、添加缺少的列和索引
	// 但不会删除未使用的列，以保护数据安全
	// 注意：这里应该使用&UserModel{}而不是&UserDetailModel{}
	err := global.DB.AutoMigrate(&UserModel{})
	if err != nil {
		// 如果迁移失败，输出错误信息
		fmt.Println("表结构迁移失败", err)
		return
	}
	// 迁移成功提示
	fmt.Println("表结构迁移成功")
}

// main 程序入口函数
// 演示如何初始化数据库连接并执行表结构迁移
func main() {
	// 初始化数据库连接
	// 调用global包中的Connect函数建立数据库连接
	// 这会设置全局的global.DB变量，用于后续的数据库操作
global.Connect()

	// 执行表结构迁移
	// 调用migrate函数自动创建或更新UserModel对应的表结构
	// 如果表不存在，则创建；如果表已存在但结构不完整，则更新
	migrate()
}
